home *** CD-ROM | disk | FTP | other *** search
-
- /* --- C ---
- ************************************************************************
- *
- * Filename : stream.c
- * Description : General stream-i/o-functions
- * Part of : SECMPEG
- *
- * Version : 1.0
- * Language : C
- * For machine : SunOS 4.1.x, INTERACTIVE Unix 2.2.1, Linux, MS-DOS
- * Compile as : see Makefile
- *
- * Authors : Juergen Meyer, Frank Gadegast
- * Contact : jm@cs.tu-berlin.de, phade@cs.tu-berlin.de
- *
- ************************************************************************
- */
-
- #include "defs.h"
- #include <fcntl.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <errno.h>
- #include <stddef.h>
- #ifdef DOS
- #ifdef GNU
- #include <malloc.h>
- #else
- #include <alloc.h>
- #include <io.h>
- #endif
- #else
- #include <malloc.h>
- #endif
- #include <sys/types.h>
- #include <sys/stat.h>
-
-
- /* ------ DEFINES ------ */
-
- #ifdef DOS
- #define INPUT_ACCESS O_BINARY|O_RDONLY
- #define OUTPUT_ACCESS O_BINARY | O_CREAT|O_TRUNC | O_RDWR
- #else
- #define INPUT_ACCESS O_RDONLY
- #define OUTPUT_ACCESS O_CREAT|O_TRUNC | O_RDWR
- #endif
- #define OUTPUT_PERMS S_IWRITE|S_IREAD
-
- /* ------ PUBLIC ------ */
-
- int InitMemory();
- void FreeMemory();
-
- int OpenInputStream(char *);
- int OpenOutputStream(char *);
- void CloseStreams();
- int WriteStream();
- int ReadStream(unsigned long);
- void CopyBuffer();
-
- int GetByte();
- int _GetnBit(int);
- int _GetBit();
-
- void readalign();
- int CheckEOF();
-
-
- /* ------ VARS ------ */
-
- extern short ENCODE;
- extern int WRITE;
-
- int input = 0;
- int output = 0;
- int end_of_file = 0;
- unsigned long total_bytes_read = 0L;
- unsigned long total_bytes_written = 0L;
-
- BYTE *io_buffer = NULL;
- BYTE *frame_buffer = NULL;
-
- static unsigned long io_buffer_end = 0;
- static unsigned long io_buffer_start = 0;
- static unsigned long frame_buffer_end = 0;
-
- static unsigned long io_buffersize = IO_BUFFERSIZE;
-
- static INT current_write_byte; /* variablen und array */
- static INT current_read_byte; /* mⁿssen nicht 32 Bit sein */
- static INT read_position; /* noch zu ⁿberprⁿfen !!!!! */
- static INT write_position; /* 8 Bit sollten genug sein */
- /* timecode --> 25 Bit GOP */
-
- INT bit_set_mask[] =
- {0x00000001,0x00000002,0x00000004,0x00000008,
- 0x00000010,0x00000020,0x00000040,0x00000080,
- 0x00000100,0x00000200,0x00000400,0x00000800,
- 0x00001000,0x00002000,0x00004000,0x00008000,
- 0x00010000,0x00020000,0x00040000,0x00080000,
- 0x00100000,0x00200000,0x00400000,0x00800000,
- 0x01000000,0x02000000,0x04000000,0x08000000,
- 0x10000000,0x20000000,0x40000000,0x80000000};
-
-
- int InitMemory()
- {
- io_buffer = (BYTE *) malloc(IO_BUFFERSIZE);
- if(!io_buffer)
- return(ERROR_MEMORY);
- frame_buffer = (BYTE *) malloc(FRAME_BUFFERSIZE);
- if(!frame_buffer)
- return(ERROR_MEMORY);
- return(TRUE);
- }
-
- void FreeMemory()
- {
- if(frame_buffer)
- free(frame_buffer);
- if(io_buffer)
- free(io_buffer);
-
- io_buffer = NULL;
- frame_buffer = NULL;
- return;
- }
-
-
- int OpenInputStream (char *StreamName)
- {
- long bytes_read = 0;
-
- #ifdef DEBUG
- fprintf(stderr,"OpenInputStream \n");
- #endif
-
- if (strcmp (StreamName, "-"))
- input = open(StreamName,INPUT_ACCESS);
- else input = 0;
- if(input < 0) return (ERROR_OPEN_INPUT);
- if (ENCODE != M_ENCODE) return (input);
- bytes_read = read (input,(void *)io_buffer, IO_BUFFERSIZE);
- if (bytes_read != IO_BUFFERSIZE)
- {
- io_buffersize = bytes_read;
- if (!bytes_read) end_of_file = TRUE;
- }
- return (input);
- }
-
- int OpenOutputStream (char *StreamName)
- {
- if (WRITE == FALSE) return (0);
- #ifdef DEBUG
- fprintf(stderr, "OpenOutputStream \n");
- #endif
- if (strcmp (StreamName, "-"))
- output = open (StreamName,OUTPUT_ACCESS,OUTPUT_PERMS);
- else output = 1;
- if (output < 0) return (ERROR_OPEN_OUTPUT);
- return (output);
- }
-
- void CloseStreams()
- {
- #ifdef DEBUG
- fprintf(stderr,"CloseMpegStream \n");
- #endif
- if (input) close(input);
- if(output) close(output);
- }
-
- int WriteStream()
- {
- if (!WRITE) return (TRUE);
- total_bytes_written += frame_buffer_end;
-
- if((write(output,(void *)frame_buffer,(unsigned)frame_buffer_end) == -1))
- return(ERROR_WRITE);
- frame_buffer_end = 0;
- return(TRUE);
- }
-
- int ReadStream(unsigned long len)
- {
- if((read(input,(void *)frame_buffer,(unsigned)len)) != (unsigned)len)
- return(ERROR_READ);
- frame_buffer_end = len;
- return(TRUE);
- }
-
- void CopyBuffer()
- {
- unsigned long len;
-
- len = io_buffer_end - io_buffer_start;
-
- while(len--)
- frame_buffer[frame_buffer_end++] = io_buffer[io_buffer_start++];
- }
-
-
- int GetByte()
- {
- long bytes_read;
-
- total_bytes_read++;
-
- if (io_buffer_end < io_buffersize)
- return((INT)io_buffer[io_buffer_end++]);
- else
- {
- CopyBuffer();
- io_buffer_start = 0;
- io_buffer_end = 0;
- bytes_read = (long)read(input,(void *)io_buffer,IO_BUFFERSIZE);
-
- if(bytes_read != IO_BUFFERSIZE)
- {
- io_buffersize = bytes_read;
- if(!bytes_read)
- {
- total_bytes_read -= 1;
- end_of_file = 1;
- #ifdef IO_DEBUG
- fprintf(stderr," GetByte --> EOF\n");
- #endif
- }
- }
-
- return((INT)io_buffer[io_buffer_end++]);
- }
- }
-
- void readalign()
- {
- current_read_byte = 0;
- read_position = -1;
- #ifdef DEBUG
- fprintf(stderr," readalign\n");
- #endif
- }
-
-
-
- int _GetBit()
- {
-
- if (read_position<0)
- {
- current_read_byte=GetByte();
- read_position = 7;
- }
- if (current_read_byte&bit_set_mask[read_position--]) {return(1);}
- return(0);
- }
-
-
- int _GetnBit(int nbits)
- {
- int b=0;
- #ifdef INT_DEBUG
- if(nbits > 16)
- if(nbits != 24){fprintf(stderr," integer ist unzureichend \n");getch();}
- #endif
-
- while(nbits--)
- {
- b <<= 1;
- if (_GetBit()) {b |= 1;}
- }
- return(b);
- }
-
-
-
- int CheckEOF()
- {
-
- #ifdef DEBUG
- fprintf(stderr,"CheckEOF\n");
- #endif
-
- return(end_of_file);
- }
-
-
-
-